<!DOCTYPE html>
<html lang="zh">
    <head>
  <!-- 元数据 -->
  <meta charset="utf-8">
  
  
  <title>文件系统（操作系统笔记8） | 舛羽的笔记小站</title>
  <meta name="author" content="cy" />
  <meta http-equiv="Cache-Control" content="no-transform" />
  <meta http-equiv="Cache-Control" content="no-siteapp" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="robots" content="index,follow" />
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
  <meta name="format-detection" content="telphone=no, email=no" />
  
    <meta name="keywords" content="操作系统" />
  
  <meta name="description" content="本章开始会讲解操作系统功能的第三个部分文件管理，详细了解操作系统是如何管理文件的。">
<meta property="og:type" content="article">
<meta property="og:title" content="文件系统（操作系统笔记8）">
<meta property="og:url" content="http://example.com/2023/01/22/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0-8/index.html">
<meta property="og:site_name" content="舛羽的笔记小站">
<meta property="og:description" content="本章开始会讲解操作系统功能的第三个部分文件管理，详细了解操作系统是如何管理文件的。">
<meta property="og:locale">
<meta property="og:image" content="https://s2.loli.net/2023/01/23/6xZMr7kizwtPC5I.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/23/9MnGHgwQe4tsVoA.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/23/WcBjGzs2oCramNU.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/23/eVy672KqCSdlz38.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/23/pSHZPMdKVBbwJuY.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/23/j59U6wYGFDnlkrc.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/24/Ubnizwt3EWBMS54.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/24/DI5NqFtcpj8ZKGy.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/24/QsbfpJPXnRjGA75.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/24/RhBvwQ2PYqkWEzn.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/24/eNORHd9uKXfWY3D.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/24/y8jf2BUXsRJzWFK.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/24/dT1cHBfjmp5uKFC.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/24/4GJhCwTxZDOgvSX.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/24/r1oXbWswaMnlCEV.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/24/5ISqRvo9eWrVQsD.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/24/r8aV1i23yBLcS7p.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/24/5t3vz1e8TBiJN2L.png">
<meta property="og:image" content="https://s2.loli.net/2023/01/24/4st2xE5NOUdQcp3.png">
<meta property="article:published_time" content="2023-01-22T02:43:47.000Z">
<meta property="article:modified_time" content="2023-02-15T01:21:21.948Z">
<meta property="article:author" content="cy">
<meta property="article:tag" content="操作系统">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://s2.loli.net/2023/01/23/6xZMr7kizwtPC5I.png">
  
  <!-- 站点验证相关 -->
  
    
    
    
  
  <!-- 样式表文件 -->
  <link rel="stylesheet" id="kratos-css" href="/css/kratosr.min.css" media="all"></script>
  
    <link rel="stylesheet" id="darkmode-css" href="/css/kr-color-dark.min.css" media="(prefers-color-scheme: dark)"></script>
    <script src="/js/kr-dark.min.js"></script>
  
  
    <link rel="stylesheet" id="highlight-css" href="/css/highlight/night-eighties.min.css" media="all"></script>
  
  
  <link rel="stylesheet" id="fontawe-css" href="/vendors/font-awesome@4.7.0/css/font-awesome.min.css" media="all"></script>
  <link rel="stylesheet" id="nprogress-css" href="/vendors/nprogress@0.2.0/nprogress.css" media="all"></script>
  
  
  
    <link rel="stylesheet" href="/vendors/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css"></script>
  
  <!-- 不得不预先加载的一些JS文件 -->
  <script src="/vendors/jquery@3.6.0/dist/jquery.min.js"></script>
  
    <script src="/vendors/qrcode_js@1.0.0/qrcode.min.js"></script>
  
  
  <style>
    
      .kratos-cover.kratos-cover-2 {
        background-image: url('/images/banner.webp');
      }
    
    
      @media(min-width:768px) {
        body.custom-background {
          background-image: url('/images/bg.webp');
        }
      }
    
  </style>
  
<meta name="generator" content="Hexo 7.3.0"></head>


    <body class="custom-background">
        <div id="kratos-wrapper">
    <div id="kratos-page">
        <div id="kratos-header">
            <header id="kratos-desktop-topnav" class="kratos-topnav">
                <div class="container">
                    <div class="nav-header">
                        <nav id="kratos-menu-wrap">
                            <ul id="kratos-primary-menu" class="sf-menu">
                                
                                    
                                    
                                
                            </ul>
                        </nav>
                    </div>
                </div>
            </header>
            <header id="kratos-mobile-topnav" class="kratos-topnav">
                <div class="container">
                    <div class="color-logo"><a href="/">舛羽的笔记小站</a></div>
                    <div class="nav-toggle">
                        <a class="kratos-nav-toggle js-kratos-nav-toggle">
                            <i></i>
                        </a>
                    </div>
                </div>
            </header>
        </div>
        <div class="kratos-start kratos-hero-2">
            <!-- <div class="kratos-overlay"></div> -->
            <div class="kratos-cover kratos-cover-2 text-center">
                <div class="desc desc2 animate-box">
                    <a href="/">
                        <h2>舛羽的笔记小站</h2> <br />
                        <span></span>
                    </a>
                </div>
            </div>
        </div>

        <div id="kratos-blog-post">
            <div class="container">
                <div id="main" class="row">
                    

        

            <section class="col-md-8">

        

            <article itemscope itemtype="https://schema.org/Article">
    
    <link itemprop="mainEntityOfPage" href="http://example.com/2023/01/22/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0-8/">
    <div class="kratos-hentry kratos-post-inner clearfix">
        <header class="kratos-entry-header">
            
                <h1 class="kratos-entry-title text-center" itemprop="name headline">文件系统（操作系统笔记8）</h1>
            
            
            <ul class="kratos-post-meta text-center">
                <li><time datetime="2023-01-22T02:43:47.000Z" itemprop="datePublished"><i class="fa fa-calendar"></i> 2023-01-22</time></li>
                <li itemprop="author" itemscope itemtype="https://schema.org/Person">
                    <i class="fa fa-user"></i> 作者 <span itemprop="name">cy</span>
                </li>
                <li>
                    <i class="fa fa-edit"></i> 
                    
                    
                        ~4.52K
                    
                    字
                </li>
                
            </ul>
        </header>
        <div class="kratos-post-content">
            
            <div id="expire-alert" class="alert alert-warning hidden" role="alert">
                <div class="icon"><i class="fa fa-warning"></i></div>
                <div class="text"><p>本文最后编辑于 <time datetime="1676424081948"></time> 前，其中的内容可能需要更新。</p></div>
            </div>
            
            
            
            <hr />
            <div itemprop="articleBody"><p>本章开始会讲解操作系统功能的第三个部分文件管理，详细了解操作系统是如何管理文件的。</p>
<span id="more"></span>
<h2 id="第八章-文件系统"><a href="#第八章-文件系统" class="headerlink" title="第八章 文件系统"></a>第八章 文件系统</h2><h3 id="8-1-文件系统概述"><a href="#8-1-文件系统概述" class="headerlink" title="8.1 文件系统概述"></a>8.1 文件系统概述</h3><p>文件：一组有意义的信息集合</p>
<p>文件的属性：</p>
<ul>
<li>文件名：由创建文件的用户决定文件名，主要是为了方便用户找到文件，同一目录下不允许有重名文件</li>
<li>标识符：一个系统内的各文件表示唯一，对用户来说毫无可读性，因此标识符知识操作系统用于区分各个文件的一种内部结构</li>
<li>类型：指明文件的类型</li>
<li>位置：文件存放的路径（用户使用）、在外存的位置（供操作系统使用）</li>
<li>大小：指明文件大小</li>
<li>保护信息：对文件进行保护的访问控制信息</li>
<li>其他信息</li>
</ul>
<p>文件的内部用一些逻辑结构组织起来</p>
<p>文件的外部则通过目录结构组织起来</p>
<p>操作系统需要向上提供相应的系统调用供用户控制文件，包括：create（创建），delete（删除），open（打开），close（关闭），read（读取），write（写入）等系统调用</p>
<p>文件在外存中也会通过相应的物理结构存储</p>
<p>操作系统也会提供相应的管理方式</p>
<p>最后操作系统需要提供文件的共享和保护功能，接下来我们会对这些功能逐一介绍</p>
<h3 id="8-2-文件的逻辑结构"><a href="#8-2-文件的逻辑结构" class="headerlink" title="8.2 文件的逻辑结构"></a>8.2 文件的逻辑结构</h3><h4 id="1-无结构文件"><a href="#1-无结构文件" class="headerlink" title="(1)无结构文件"></a>(1)无结构文件</h4><p>无结构文件指的是文件内部的数据就是一些列二进制流或字符流组成。又称“流式文件”。</p>
<p>最典型的就是Windows里面的.txt文件</p>
<h4 id="2-有结构文件"><a href="#2-有结构文件" class="headerlink" title="(2)有结构文件"></a>(2)有结构文件</h4><p>有结构文件：</p>
<p>由一组相似的记录组成，又称“记录式文件”。每条记录又若干各数据项组成。</p>
<p>根据各条记录的长度是否相等，又可分为定长记录和可变长记录。</p>
<p>定长记录：</p>
<p><img src="https://s2.loli.net/2023/01/23/6xZMr7kizwtPC5I.png" alt=""></p>
<p>不定长记录：</p>
<p><img src="https://s2.loli.net/2023/01/23/9MnGHgwQe4tsVoA.png" alt=""></p>
<h4 id="3-有结构文件的逻辑结构"><a href="#3-有结构文件的逻辑结构" class="headerlink" title="(3)有结构文件的逻辑结构"></a>(3)有结构文件的逻辑结构</h4><p>顺序文件：</p>
<p>顺序文件：文件中的记录一个接一个地顺序排列（逻辑上），记录可以是定长的或可变长的。各个记录在物理上可以顺序存储或链式存储。</p>
<p>链式存储无法实现随机存取，所以一般不考虑。</p>
<p>顺序存储中，可变长记录无法实现随机存取，每次只能从第一个记录开始依次往后查找。而定长记录可实现随机存取。</p>
<p>顺序存储的缺点：增加/删除一个记录比较困难。</p>
<p>索引文件：</p>
<p>索引文件：建立一张索引表，每个记录对应一个表项，各记录不用保持顺序，方便增加/删除记录</p>
<p>索引表：索引表本身就是定长记录的顺序文件一个索引表项就是一条定长记录，因此索引文件可支持随机存取</p>
<p>若索引表按关键字排序，则可支持快速检索。</p>
<p>解决了顺序文件不方便增/删记录的问题，同时让不定长记录的文件实现了随机存取。但素引表可能占用很多空间</p>
<p>索引顺序文件：</p>
<p>索引顺序文件：将记录分组，每组对应一个索引表项</p>
<p>检查方式：检查记录时先顺序查索引表，找到分组，再顺序朝朝分组</p>
<p>当记录过多时，可建立多级索引表</p>
<h3 id="8-3-文件的目录结构"><a href="#8-3-文件的目录结构" class="headerlink" title="8.3 文件的目录结构"></a>8.3 文件的目录结构</h3><h4 id="1-文件控制块"><a href="#1-文件控制块" class="headerlink" title="(1)文件控制块"></a>(1)文件控制块</h4><p>为了能对一个文件进行正确的存取，必须为文件设置用于描述和控制文件的数据结构，称为进程控制块（FCB）。</p>
<p>一个文件对应一个FCB,一个FCB就是一个目录项，多个FCB组成文件目录。</p>
<p>在FCB中通常应该包含3类信息：</p>
<ol>
<li>基本信息类：<ul>
<li>文件名：用于标志一个文件的符号名</li>
<li>文件物理位置：指文件在外存中的存储位置</li>
<li>文件逻辑结构：知识文件时六文件还是记录式文件</li>
<li>文件的物理结构：指示文件在外存的存储位置</li>
</ul>
</li>
<li>存取控制信息类：存取控制信息类</li>
<li>使用信息类：文件建立时间，修改时间，是否被锁等信息</li>
</ol>
<p>通过文件控制块我们需要对目录完成以下操作：</p>
<p>搜索、创建文件、删除文件、显示文件、修改文件</p>
<h4 id="2-目录结构"><a href="#2-目录结构" class="headerlink" title="(2)目录结构"></a>(2)目录结构</h4><h5 id="2-1-单级目录结构"><a href="#2-1-单级目录结构" class="headerlink" title="(2.1)单级目录结构"></a>(2.1)单级目录结构</h5><p><img src="https://s2.loli.net/2023/01/23/WcBjGzs2oCramNU.png" alt=""></p>
<h5 id="2-2-两级页表目录"><a href="#2-2-两级页表目录" class="headerlink" title="(2.2)两级页表目录"></a>(2.2)两级页表目录</h5><p><img src="https://s2.loli.net/2023/01/23/eVy672KqCSdlz38.png" alt=""></p>
<h5 id="2-3-树形目录"><a href="#2-3-树形目录" class="headerlink" title="(2.3)树形目录"></a>(2.3)树形目录</h5><p><img src="https://s2.loli.net/2023/01/23/pSHZPMdKVBbwJuY.png" alt=""></p>
<h5 id="2-4-无环图目录"><a href="#2-4-无环图目录" class="headerlink" title="(2.4)无环图目录"></a>(2.4)无环图目录</h5><p><img src="https://s2.loli.net/2023/01/23/j59U6wYGFDnlkrc.png" alt=""></p>
<h4 id="3-索引节点"><a href="#3-索引节点" class="headerlink" title="(3)索引节点"></a>(3)索引节点</h4><p>索引节点是对FCB的优化，将除了文件名之外的所有信息都放到索引节点中，每个文件对应一个索引节点</p>
<p>目录象中只包含文件名，索引节点指针，因此每个目录象的长度大幅缩小</p>
<p>由于目录项长度减小，因此每个磁盘块可以存放更多个目录项，检索文件时磁盘I/O的次数少了很多</p>
<h3 id="8-4-文件的物理结构"><a href="#8-4-文件的物理结构" class="headerlink" title="8.4 文件的物理结构"></a>8.4 文件的物理结构</h3><p>文件块：类似于内存分页，磁盘中的存储单元也会被分为一个个“块/磁盘块/物理块”。内存与磁盘之间的数据都是以“块”为单位进行的。级每次读入一块，或每次写出一块。</p>
<p><img src="https://s2.loli.net/2023/01/24/Ubnizwt3EWBMS54.png" alt=""></p>
<h4 id="1-连续分配"><a href="#1-连续分配" class="headerlink" title="(1)连续分配"></a>(1)连续分配</h4><p>方式：连续分配方式要求每个文件在磁盘上占有一组连续的块。</p>
<p>地址映射：$物理块号=起始块号+逻辑块号$，$物理地址=物理块号+块内地址$</p>
<p>文件目录中记录存放的<code>起始块号</code>和<code>长度</code>。</p>
<p>由于可以直接算出逻辑块号的物理块号，因此连续分配<font color="red">支持顺序访问和随机访问</font>。</p>
<p>优点：</p>
<ol>
<li>支持顺序访问和随机访问</li>
<li>由于读取某个磁盘块时，需要移动磁头。访问的连个磁盘块相隔越远，移动磁头所需时间就越长。连续分配的文件在<font color='red'>顺序读/写速度最快</font>。</li>
</ol>
<p>缺点：</p>
<ol>
<li>物理上采用连续分配的文件<font color='red'>不方便拓展</font></li>
<li><font color='red'>存储空间利用率低</font>，会<font color='red'>产生难以利用的磁盘碎片</font>，可以用紧凑来解决，但是需要耗费很大的时间代价</li>
</ol>
<h4 id="2-链接分配"><a href="#2-链接分配" class="headerlink" title="(2)链接分配"></a>(2)链接分配</h4><p>方式：采用离散分配的方式，可以为文件分散的磁盘块。分为隐式链接和显式链接两种。</p>
<h5 id="2-1-隐式链接"><a href="#2-1-隐式链接" class="headerlink" title="(2.1)隐式链接"></a>(2.1)隐式链接</h5><p>方式：</p>
<ol>
<li>目录中记录了文件存放的起始块号和结束块号，也可以增加一个字段来表示文件的长度。</li>
<li>除了文件的最后一个磁盘块之外，每个磁盘块中都会保存指向下一个盘块的指针，这些指针对用户是透明的。</li>
</ol>
<p>地址转换：从目录项中找到起始块号（即0号块），将0号逻辑块读入内存，由此知道1号逻辑块存放的物理块号，于是读入1号逻辑块，再找到2号逻辑块的存放位置…以此类推。因此，读入i号逻辑块，总共需要i+1次磁盘I/O</p>
<p>优点：</p>
<ol>
<li>方便拓展文件</li>
<li>不会有碎片问题</li>
<li>外存利用率高</li>
</ol>
<p>缺点：</p>
<ol>
<li>只<font color='red'>支持顺序访问</font>，<font color='red'>不支持随机访问</font>，查找效率低。</li>
<li>指向下一个盘块的指针也需要耗费少量的存储空间</li>
</ol>
<h5 id="2-2-显式链接"><a href="#2-2-显式链接" class="headerlink" title="(2.2)显式链接"></a>(2.2)显式链接</h5><p>方式：</p>
<ol>
<li>把用于连接文件各物理块的指针显示地存放在一张表中。即文件分配表（FAT），一个磁盘仅需设置一张，开机时将FAT读入内存，并常驻内存。</li>
<li>目录中只需要保存起始块号</li>
</ol>
<p>地址转移：从目录项中找到起始块号，若&gt;0，则查询内存中的文件分配表FAT,往后找到i号逻辑块对应的物理块号。逻辑块号转换成物理块号的过程<font color='red'>不需要读磁盘操作</font>。</p>
<p>优点:</p>
<ol>
<li>方便拓展文件</li>
<li>不会有碎片问题</li>
<li>外存利用率高</li>
<li>支持随机访问</li>
<li>地址转换时不需要访问磁盘,因此文件地访问效率更高</li>
</ol>
<p>缺点:</p>
<ol>
<li>文件分配表需要占用一定地存储空间</li>
</ol>
<h4 id="3-索引分配"><a href="#3-索引分配" class="headerlink" title="(3)索引分配"></a>(3)索引分配</h4><p>方式：索引分配允许文件离散地分配在各个磁盘块中，系统会<font color='red'>为每个文件建立一张索引表</font>，索引表中<font color='red'>记录了文件的各个逻辑块对应的物理块</font>（索引表的功能类似于内存管理中的页表一一建立逻辑页面到物理页之间的映射关系)。索引表存放的磁盘块称为<font color='red'>索引块</font>。文件数据存放的磁盘块称为<font color='red'>数据块</font>。</p>
<p>地址转换：目录中记录索引块位置，将索引表从外存读入内存，并查找索引表即可得到i号逻辑块在外存中的存放位置。</p>
<p>优点：</p>
<ol>
<li>支持随机访问</li>
<li>文件拓展也很容易实现</li>
</ol>
<p>缺点：</p>
<ol>
<li>索引表需占用一定的存储空间</li>
<li>访问数据块前需要限度如索引块</li>
</ol>
<p>索引表连接方案：</p>
<p>如果索引表太大，一个索引块装不下，那么可以将多个索引块连接起来存放。</p>
<p>缺点：若文件很大，索引表很长，就需要将很多各索引块连接起来。想要找到i号索引块，必须先一次读入0~i-1号索引块，这就导致磁盘I/O次数过多，查找效率低下。</p>
<p>多层索引：建立多层索引（原理类似于多级页表）。使第一层索引块指向第二层的索引块。还可根据文件大小的要求再建立第三层、第四层索引块。</p>
<p>混合索引：多种索引分配方式的结合。例如，一个文件的顶级索引表中，既包含直接地址索引（直接指向数据块)，又包含一级间接索引（指向单层索引表）、还包含两级间接索引（指向两层索引表）</p>
<h3 id="8-5-文件存储区空间的管理"><a href="#8-5-文件存储区空间的管理" class="headerlink" title="8.5 文件存储区空间的管理"></a>8.5 文件存储区空间的管理</h3><p>在为文件分配盘块时，因此必须知道磁盘上那些盘块是可用于分配的。在位文件分配盘块是，除了需要文件分配表歪，系统还应为可分配存储空间设置相应的数据结构，即设置一个磁盘分配表，用于记住可提供分配的存储空间情况。此外还应提供对盘块进行分配和回收的手段。</p>
<h4 id="1-存储空间的换份与初始化"><a href="#1-存储空间的换份与初始化" class="headerlink" title="(1)存储空间的换份与初始化"></a>(1)存储空间的换份与初始化</h4><p><img src="https://s2.loli.net/2023/01/24/DI5NqFtcpj8ZKGy.png" alt=""></p>
<h4 id="2-空闲表法"><a href="#2-空闲表法" class="headerlink" title="(2)空闲表法"></a>(2)空闲表法</h4><p>方式：空闲表中记录每个连续空去的起始盘块号，盘块数</p>
<p>分配磁盘块：与内存管理中的动态分区分配很类似，为一个文件分配连续的存储空间。同样可采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间。</p>
<p>回收磁盘块：与内存管理中的动态分区分配很类似，当回收某个存储区时需要有四种情况</p>
<ol>
<li>回收区的前后都没有相邻空闲区</li>
<li>回收区的前后都是空闲区</li>
<li>回收区前面是空闲区</li>
<li>回收区后面是空闲区。</li>
</ol>
<p>总之，回收时需要注意表项的合并问题。</p>
<h4 id="3-空闲链表法"><a href="#3-空闲链表法" class="headerlink" title="(3)空闲链表法"></a>(3)空闲链表法</h4><p>可把链表分为两种形式：</p>
<h5 id="3-1-空闲盘块链"><a href="#3-1-空闲盘块链" class="headerlink" title="(3.1)空闲盘块链"></a>(3.1)空闲盘块链</h5><p><img src="https://s2.loli.net/2023/01/24/QsbfpJPXnRjGA75.png" alt=""></p>
<h5 id="3-2-空闲盘区链"><a href="#3-2-空闲盘区链" class="headerlink" title="(3.2)空闲盘区链"></a>(3.2)空闲盘区链</h5><p><img src="https://s2.loli.net/2023/01/24/RhBvwQ2PYqkWEzn.png" alt=""></p>
<h5 id="3-3-位示图法"><a href="#3-3-位示图法" class="headerlink" title="(3.3)位示图法"></a>(3.3)位示图法</h5><p><img src="https://s2.loli.net/2023/01/24/eNORHd9uKXfWY3D.png" alt=""></p>
<p>分配方法：若文件需要K个块</p>
<ol>
<li>顺序扫描位示图，找到K个相邻或不相邻的“0”</li>
<li>根据字号、位号算出对应的盘块号，将相应盘块分配给文件</li>
<li>将相应位设置为“1”</li>
</ol>
<p>回收方法：</p>
<ol>
<li>根据回收的盘块号计算出对应的字号、位号</li>
<li>将相应二进制位设为“0”</li>
</ol>
<h4 id="4-成组链接法"><a href="#4-成组链接法" class="headerlink" title="(4)成组链接法"></a>(4)成组链接法</h4><p>空闲表法、空闲链表法不适用于大型文件系统，因为空闲表或空闲链表可能过大。UNIX系统中采用了成组链接法对磁盘空闲块进行管理。</p>
<p>文件卷的目录区中专门用一个磁盘块作为“超级块”，当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致。</p>
<p><img src="https://s2.loli.net/2023/01/24/y8jf2BUXsRJzWFK.png" alt=""></p>
<p>分配方法：</p>
<p>Eg：需要100个空闲块</p>
<ol>
<li>检查第一个分组的块数是否足够。100=100，是足够的。</li>
<li>分配第一个分组中的100个空闲块。但是由于300号块内存放了再下一组的信息，因此300号块的数据需要复制到超级块中</li>
</ol>
<p>回收方法：</p>
<p>Eg：假设每个分组最多为100个空闲块</p>
<ol>
<li><p>此时第一个分组已有99个块，还要再回收一块。需要将超级块中的数据增加上这个块</p>
</li>
<li><p>此时第一个分组已有100个块，还要再回收一块。需要将超级块中的数据复制到新回收的块中，并修改超级块的内容，让新回收的块成为第一个分组。</p>
</li>
</ol>
<h3 id="8-6-文件操作原理"><a href="#8-6-文件操作原理" class="headerlink" title="8.6 文件操作原理"></a>8.6 文件操作原理</h3><p><img src="https://s2.loli.net/2023/01/24/dT1cHBfjmp5uKFC.png" alt=""></p>
<h3 id="8-7-文件共享"><a href="#8-7-文件共享" class="headerlink" title="8.7 文件共享"></a>8.7 文件共享</h3><p>文件共享主要分为两种：基于索引节点的共享方式也被称为硬链接，基于符号量的共享方式被称为软链接。</p>
<h4 id="1-基于索引节点（硬链接）"><a href="#1-基于索引节点（硬链接）" class="headerlink" title="(1)基于索引节点（硬链接）"></a>(1)基于索引节点（硬链接）</h4><p><img src="https://s2.loli.net/2023/01/24/4GJhCwTxZDOgvSX.png" alt=""></p>
<h4 id="2-基于符号链的共享方式"><a href="#2-基于符号链的共享方式" class="headerlink" title="(2)基于符号链的共享方式"></a>(2)基于符号链的共享方式</h4><p><img src="https://s2.loli.net/2023/01/24/r1oXbWswaMnlCEV.png" alt=""></p>
<p>其实就是快捷方式</p>
<p><img src="https://s2.loli.net/2023/01/24/5ISqRvo9eWrVQsD.png" alt=""></p>
<h3 id="8-8-文件保护"><a href="#8-8-文件保护" class="headerlink" title="8.8 文件保护"></a>8.8 文件保护</h3><p><img src="https://s2.loli.net/2023/01/24/r8aV1i23yBLcS7p.png" alt=""></p>
<h3 id="8-9-文件系统层次结构"><a href="#8-9-文件系统层次结构" class="headerlink" title="8.9 文件系统层次结构"></a>8.9 文件系统层次结构</h3><p><img src="https://s2.loli.net/2023/01/24/5t3vz1e8TBiJN2L.png" alt=""></p>
<ul>
<li>用户接口：文件系统需要向上层的用户提供一些简单易用的功能接口。这层就是用于处理用户发出的系统调用请求(Read、Write、Open、Close等系统调用)</li>
<li>文件目录系统：用户是通过文件路径来访问文件的，因此这一层需要根据用户给出的文件路径找到相应的FCB或索引结点。所有和目录、目录项相关的管理工作都在本层完成，如：管理活跃的文件目录表、管理打开文件表等</li>
<li>存取控制模块：为了保证文件数据的安全，还需要验证用户是否有访问权限。这一层主要完成了文件保护相关功能。</li>
<li>逻辑文件系统与文件信息缓冲区：用户指明想要访问文件记录号，这一层需要将记录号转换为对应的逻辑地址</li>
<li>物理文件系统：这一层需要把上一层提供的文件逻辑地址转换为实际的物理地址</li>
<li>辅助分配模块：负责文件存储空间的管理，即负责分配和回收存储空间</li>
<li>设备管理模块：直接与硬件交互，负责和硬件直接相关的一些管理工作。如：分配设备、分配设备缓冲区、磁盘调度、启动设备、释放设备等</li>
</ul>
<p><img src="https://s2.loli.net/2023/01/24/4st2xE5NOUdQcp3.png" alt=""></p>
</div>
        </div>
        
            <div class="kratos-copyright text-center clearfix">
                <h5 itemprop="copyrightNotice">本作品采用 <a rel="license nofollow" target="_blank" href="https://creativecommons.org/licenses/by-sa/4.0/">知识共享署名-相同方式共享 4.0 国际许可协议</a> 进行许可</h5>
            </div>
        
        <footer class="kratos-entry-footer clearfix">
            
                <div class="post-like-donate text-center clearfix" id="post-like-donate">
                
                
                    <a class="share" href="javascript:;"><i class="fa fa-share-alt"></i> 分享</a>
                    <div class="share-wrap" style="display: none;">
    <div class="share-group">
        <a href="javascript:;" class="share-plain qq" onclick="share('qq');" rel="nofollow">
            <div class="icon-wrap">
                <i class="fa fa-qq"></i>
            </div>
        </a>
        <a href="javascript:;" class="share-plain qzone" onclick="share('qzone');" rel="nofollow">
            <div class="icon-wrap">
                <i class="fa fa-star"></i>
            </div>
        </a>
        <a href="javascript:;" class="share-plain weixin pop style-plain" rel="nofollow">
            <div class="icon-wrap">
                <i class="fa fa-weixin"></i>
            </div>
            <div class="share-int">
                <div class="qrcode" id="wechat-qr"></div>
                <p>打开微信“扫一扫”，打开网页后点击屏幕右上角分享按钮</p>
            </div>
        </a>
        <a href="javascript:;" class="share-plain weibo" onclick="share('weibo');" rel="nofollow">
            <div class="icon-wrap">
                <i class="fa fa-weibo"></i>
            </div>
        </a>
        <a href="javascript:;" class="share-plain facebook style-plain" onclick="share('facebook');" rel="nofollow">
            <div class="icon-wrap">
                <i class="fa fa-facebook"></i>
            </div>
        </a>
        <a href="javascript:;" class="share-plain twitter style-plain" onclick="share('twitter');" rel="nofollow">
            <div class="icon-wrap">
                <i class="fa fa-twitter"></i>
            </div>
        </a>
    </div>
    <script type="text/javascript">
        $(()=>{
            new QRCode("wechat-qr", {
                text: "http://example.com/2023/01/22/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0-8/",
                width: 150,
                height: 150,
                correctLevel : QRCode.CorrectLevel.H
            });
        });
        function share(dest) {
            const qqBase        = "https://connect.qq.com/widget/shareqq/index.html?";
            const weiboBase     = "https://service.weibo.com/share/share.php?";
            const qzoneBase     = "https://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?";
            const facebookBase  = "https://www.facebook.com/sharer/sharer.php?";
            const twitterBase   = "https://twitter.com/intent/tweet?";
            const hostUrl       = "http://example.com/2023/01/22/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0-8/";
            const title         = "「文件系统（操作系统笔记8）」";
            const excerpt       = `本章开始会讲解操作系统功能的第三个部分文件管理，详细了解操作系统是如何管理文件的。`;
            let _URL;
            switch (dest) {
                case "qq"       : _URL = qqBase+"url="+hostUrl+"&title="+title+"&desc=&summary="+excerpt+"&site=cxpy";     break;
                case "weibo"    : _URL = weiboBase+"url="+hostUrl+"&title="+title+excerpt;                                 break;
                case "qzone"    : _URL = qzoneBase+"url="+hostUrl+"&title="+title+"&desc=&summary="+excerpt+"&site=cxpy";  break;
                case "facebook" : _URL = facebookBase+"u="+hostUrl;                                                        break;
                case "twitter"  : _URL = twitterBase+"text="+title+excerpt+"&url="+hostUrl;                                break;
            }
            window.open(_URL);
        };
    </script>
</div>
                
                </div>
            
            <div class="footer-tag clearfix">
                <div class="pull-left">
                <i class="fa fa-tags"></i>
                    <a class="tag-none-link" href="/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/" rel="tag">操作系统</a>
                </div>
                <div class="pull-date">
                    <time datetime="2023-02-15T01:21:21.948Z" itemprop="dateModified">最后编辑：2023-02-15</time>
                </div>
            </div>
        </footer>
    </div>
    
        <nav class="navigation post-navigation clearfix" role="navigation">
            
            <div class="nav-previous clearfix">
                <a title=" 虚拟内存（操作系统笔记7）" href="/2023/01/20/操作系统笔记/操作系统笔记-7/">&lt; 上一篇</a>
            </div>
            
            
            <div class="nav-next clearfix">
                <a title=" 磁盘组织与管理（操作系统笔记9）" href="/2023/01/24/操作系统笔记/操作系统笔记-9/">下一篇 &gt;</a>
            </div>
            
        </nav>
    
    
</article>

        

            </section>

        

                
            

<section id="kratos-widget-area" class="col-md-4 hidden-xs hidden-sm">
    <!-- 文章和页面根据splitter来分割，没有的话就从头开始设置为sticky -->
    
    
                <aside id="krw-about" class="widget widget-kratos-about clearfix">
    <div class="photo-background"></div>
    <div class="photo-wrapper clearfix">
        <div class="photo-wrapper-tip text-center">
            <img class="about-photo" src="/images/avatar.webp" loading="lazy" decoding="auto" />
        </div>
    </div>
    <div class="textwidget">
        <p class="text-center"></p>
    </div>
    <div class="site-meta">
        <a class="meta-item" href="/archives/">
            <span class="title">
                文章
            </span>
            <span class="count">
                39
            </span>
        </a>
        <a class="meta-item" href="/categories/">
            <span class="title">
                分类
            </span>
            <span class="count">
                7
            </span>
        </a>
        <a class="meta-item" href="/tags/">
            <span class="title">
                标签
            </span>
            <span class="count">
                10
            </span>
        </a>
    </div>
</aside>
            
                    <div class="sticky-area">
                
                
  <aside id="krw-categories" class="widget widget-kratos-categories clearfix">
    <h4 class="widget-title"><i class="fa fa-folder"></i>分类目录</h4>
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/C-%E7%9F%A5%E8%AF%86/">C#知识</a><span class="category-list-count">9</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/Lua/">Lua</a><span class="category-list-count">10</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/Unity%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/">Unity网络游戏开发</a><span class="category-list-count">3</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%AE%9D%E5%8F%AF%E6%A2%A6%E5%B0%8F%E8%AF%B4/">宝可梦小说</a><span class="category-list-count">5</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/">操作系统笔记</a><span class="category-list-count">10</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AC%94%E8%AE%B0/">数据结构笔记</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E9%9A%8F%E6%83%B3/">随想</a><span class="category-list-count">1</span></li></ul>
  </aside>


            
                
  <aside id="krw-tags" class="widget widget-kratos-tags clearfix">
    <h4 class="widget-title"><i class="fa fa-tags"></i>标签聚合</h4>
      <div class="tag-clouds">
        <a href="/tags/C/" style="font-size: 0.75em;">C#</a> <a href="/tags/Lua/" style="font-size: 0.8em;">Lua</a> <a href="/tags/unity/" style="font-size: 0.65em;">unity</a> <a href="/tags/%E5%AE%9D%E5%8F%AF%E6%A2%A6/" style="font-size: 0.7em;">宝可梦</a> <a href="/tags/%E5%BD%B1%E8%AF%84/" style="font-size: 0.6em;">影评</a> <a href="/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/" style="font-size: 0.8em;">操作系统</a> <a href="/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" style="font-size: 0.6em;">数据结构</a> <a href="/tags/%E7%AE%97%E6%B3%95/" style="font-size: 0.6em;">算法</a> <a href="/tags/%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F/" style="font-size: 0.65em;">网络游戏</a> <a href="/tags/%E9%9A%8F%E6%83%B3/" style="font-size: 0.6em;">随想</a>
      </div>
  </aside>

            
                
  <aside id="krw-posts" class="widget widget-kratos-posts">
  <h4 class="widget-title"><i class="fa fa-file"></i>最新文章</h4>
  <div class="tab-content">
      <ul class="list-group">
        
        
          
          
            <a class="list-group-item" href="/2025/10/08/%E9%9A%8F%E6%83%B3/%E3%80%8A%E6%98%9F%E4%B8%89%E5%9B%BD%E3%80%8B%E5%90%90%E6%A7%BD/"><i class="fa  fa-book"></i> 《星三国》吐槽</a>
            
          
        
          
          
            <a class="list-group-item" href="/2023/08/14/%E5%AE%9D%E5%8F%AF%E6%A2%A6%E5%B0%8F%E8%AF%B4/%E5%AE%9D%E5%8F%AF%E6%A2%A6%E5%B0%8F%E8%AF%B45/"><i class="fa  fa-book"></i> 宝可梦小说第五章</a>
            
          
        
          
          
            <a class="list-group-item" href="/2023/08/13/%E5%AE%9D%E5%8F%AF%E6%A2%A6%E5%B0%8F%E8%AF%B4/%E5%AE%9D%E5%8F%AF%E6%A2%A6%E5%B0%8F%E8%AF%B44/"><i class="fa  fa-book"></i> 宝可梦小说第四章</a>
            
          
        
          
          
            <a class="list-group-item" href="/2023/08/10/%E5%AE%9D%E5%8F%AF%E6%A2%A6%E5%B0%8F%E8%AF%B4/%E5%AE%9D%E5%8F%AF%E6%A2%A6%E5%B0%8F%E8%AF%B43/"><i class="fa  fa-book"></i> 宝可梦小说第三章</a>
            
          
        
          
          
            <a class="list-group-item" href="/2023/08/09/%E5%AE%9D%E5%8F%AF%E6%A2%A6%E5%B0%8F%E8%AF%B4/%E5%AE%9D%E5%8F%AF%E6%A2%A6%E5%B0%8F%E8%AF%B42/"><i class="fa  fa-book"></i> 宝可梦小说第二章</a>
            
          
        
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
          
            
      </ul>
  </div>
  </aside>

            
    </div>
</section>
        
        </div>
    </div>
</div>
<footer>
    <div id="footer"  >
        <div class="container">
            <div class="row">
                <div class="col-md-6 col-md-offset-3 footer-list text-center">
                    <ul class="kratos-social-icons">
                        
                        
                        
                        
                        
                        
                        
                        
                        
                    </ul>
                    <ul class="kratos-copyright">
                        <div>
                            <li>&copy; 2025 舛羽的笔记小站 版权所有.</li>
                            <li>本站已运行<span id="span_dt">Loading...</span></li>
                        </div>
                        <div>
                            <li>Theme <a href="https://github.com/Candinya/Kratos-Rebirth" target="_blank">Kratos:Rebirth</a></li>
                            <li>Site built with&nbsp;<i class="fa fa-heart throb" style="color:#d43f57"></i>&nbsp;by cy.</li>
                        </div>
                        <div>
                            <li>Powered by <a href="https://hexo.io" target="_blank" rel="nofollow">Hexo</a></li>
                            <li>Hosted on <a href="https://github.io" target="_blank">Github Pages</a></li>
                        </div>
                        <div>
                            
                            
                        </div>
                    </ul>
                </div>
            </div>
        </div>
        <div class="kr-tool text-center">
            <div class="tool">
                
                    <div class="box search-box">
                        <a href="/search/">
                            <span class="fa fa-search"></span>
                        </a>
                    </div>
                
                
                    <div class="box theme-box" id="darkmode-switch">
                        <span class="fa fa-adjust"></span>
                    </div>
                
                
            </div>
            <div class="box gotop-box">
                <span class="fa fa-chevron-up"></span>
            </div>
        </div>
    </div>
</footer>
</div>
</div>

        <script defer src="/vendors/bootstrap@3.3.4/dist/js/bootstrap.min.js"></script>
<script defer src="/vendors/nprogress@0.2.0/nprogress.js"></script>
<script>
    if (!window.kr) {
        window.kr = {};
    }
    window.kr.notMobile = (!(navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)));
    window.kr.siteRoot = "/";
</script>


    <script async src="/js/candy.min.js"></script>




    <script defer src="/vendors/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js"></script>

<script defer src="/vendors/clipboard@2.0.6/dist/clipboard.min.js"></script>
<script defer src="/js/kratosr.min.js"></script>
<script defer src="/js/pjax.min.js"></script>



<!-- Extra support for third-party plguins  -->


    <script type="text/x-mathjax-config">
    MathJax.Hub.Config({
        tex2jax: {
            inlineMath: [ ["$","$"], ["\\(","\\)"] ],
            skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code'],
            processEscapes: true
        }
    });
    MathJax.Hub.Queue(function() {
        var all = MathJax.Hub.getAllJax();
        for (var i = 0; i < all.length; ++i)
            all[i].SourceElement().parentNode.className += ' has-jax';
    });
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML
"></script>
</body>
</html>